package com.vdong.redis.data.core.json.ops.impl;

import com.vdong.redis.data.core.json.FastJsonRedisTemplate;
import com.vdong.redis.data.core.json.ops.FastJsonBoundListOperations;
import org.springframework.data.redis.connection.DataType;
import org.springframework.data.redis.core.BoundListOperations;

import java.util.Date;
import java.util.List;
import java.util.concurrent.TimeUnit;

/**
 * ops覆盖类，可提供原先ops没有的方法
 *
 * @author <a href="mailto:zhudelie@zuozh.com">zhudelie</a>
 * @since JDK 1.6
 * create on 2017年3月31日
 * Copyright 2017 ZZJR All Rights Reserved.
 */
public class FastJsonBoundListOperationsImpl<K, V> extends OperationsAware<K, V> implements FastJsonBoundListOperations<K, V> {
    private BoundListOperations<K, V> ops;

    public FastJsonBoundListOperationsImpl(BoundListOperations<K, V> ops, FastJsonRedisTemplate<K, V> template) {
        super(template);
        this.ops = ops;
    }


    private BoundListOperations<K, V> getOps() {
        return ops;
    }

    /**
     * 得到当前key
     */

    public K getKey() {
        // TODO Auto-generated method stub
        return (K) getOps().getKey();
    }

    /**
     * 得到当前存储类型
     */

    public DataType getType() {
        // TODO Auto-generated method stub
        return getOps().getType();
    }

    /**
     * 得到过期时间
     */

    public Long getExpire() {
        // TODO Auto-generated method stub
        return getOps().getExpire();
    }

    /**
     * 设置过期时间
     */

    public Boolean expire(long timeout, TimeUnit unit) {
        // TODO Auto-generated method stub
        return getOps().expire(timeout, unit);
    }

    /**
     * 设置过期日期
     */

    public Boolean expireAt(Date date) {
        // TODO Auto-generated method stub
        return getOps().expireAt(date);
    }

    /**
     * 取消过期时间
     */

    public Boolean persist() {
        // TODO Auto-generated method stub
        return getOps().persist();
    }

    /**
     * key重命名
     */

    public void rename(K newKey) {
        getOps().rename(newKey);
    }

    /**
     * 获取从start到end下表的所有元素
     */

    public List<V> range(long start, long end) {
        // TODO Auto-generated method stub
        return getOps().range(start, end);
    }

    /**
     * 修剪列表，保留从start到end下表的元素
     */

    public void trim(long start, long end) {
        getOps().trim(start, end);
    }

    /**
     * 个数
     */

    public Long size() {
        // TODO Auto-generated method stub
        return getOps().size();
    }

    /**
     * 从左边加入队列
     */

    public Long leftPush(V value) {
        // TODO Auto-generated method stub
        return getOps().leftPush(value);
    }

    /**
     * 多个元素从左边加入队列
     */

    public Long leftPushAll(@SuppressWarnings("unchecked") V... values) {
        // TODO Auto-generated method stub
        return getOps().leftPushAll(values);
    }

    /**
     * 从左边加入队列，如果该队列存在的话
     */

    public Long leftPushIfPresent(V value) {
        // TODO Auto-generated method stub
        return getOps().leftPushIfPresent(value);
    }

    /**
     * 在存在的元素之前插入元素
     */

    public Long leftPush(V pivot, V value) {
        // TODO Auto-generated method stub
        return getOps().leftPush(pivot, value);
    }

    /**
     * 从右加入队列
     */

    public Long rightPush(V value) {
        // TODO Auto-generated method stub
        return getOps().rightPush(value);
    }

    /**
     * 多个元素从右加入队列
     */

    public Long rightPushAll(@SuppressWarnings("unchecked") V... values) {
        // TODO Auto-generated method stub
        return getOps().rightPushAll(values);
    }

    /**
     * 从右加入队列，如果该队列存在的话
     */

    public Long rightPushIfPresent(V value) {
        // TODO Auto-generated method stub
        return getOps().rightPushIfPresent(value);
    }

    /**
     * 在某个元素之后加入元素
     */

    public Long rightPush(V pivot, V value) {
        // TODO Auto-generated method stub
        return getOps().rightPush(pivot, value);
    }

    /**
     * 在指定位置加入元素
     */

    public void set(long index, V value) {
        // TODO Auto-generated method stub
        getOps().set(index, value);
    }

    /**
     * 删除n个和给定值相同的元素
     */

    public Long remove(long count, Object value) {
        // TODO Auto-generated method stub
        return getOps().remove(count, value);
    }

    /**
     * 获得指定位置的元素
     */

    public V index(long index) {
        // TODO Auto-generated method stub
        return (V) getOps().index(index);
    }

    /**
     * 左边第一个元素出队
     */

    public V leftPop() {
        // TODO Auto-generated method stub
        return (V) getOps().leftPop();
    }

    /**
     * 左边第一个元素出队，阻塞模式
     */

    public V leftPop(long timeout, TimeUnit unit) {
        // TODO Auto-generated method stub
        return (V) getOps().leftPop();
    }

    /**
     * 右边第一个元素出队
     */

    public V rightPop() {
        // TODO Auto-generated method stub
        return (V) getOps().rightPop();
    }

    /**
     * 右边第一个元素出队，阻塞模式
     */

    public V rightPop(long timeout, TimeUnit unit) {
        // TODO Auto-generated method stub
        return (V) getOps().rightPop(timeout, unit);
    }


}
